import { createApp } from 'vue'
import { createPinia } from 'pinia'
import { createRouter, createWebHashHistory } from 'vue-router'
import App from './App.vue'
import './index.css'
import 'font-awesome/css/font-awesome.min.css'
import routes from './router'
import { isLoggedIn, isAdmin } from './utils/auth'
import { getCurrentUser } from '@/api/user'
import { checkPermission, checkRole } from '@/api/auth'
import { registerAuthDirectives } from './directives/auth'
import requestInstance from './utils/request' 

const app = createApp(App)
const pinia = createPinia()
const router = createRouter({
  history: createWebHashHistory(),
  routes
})

// 全局路由守卫
router.beforeEach((to, from, next) => {
  // 不需要登录的页面
  const publicPages = ['/login', '/register', '/forgot-password']
  const authRequired = !publicPages.includes(to.path)
  
  // 检查是否需要登录
  if (authRequired && !isLoggedIn()) {
    // 未登录，重定向到登录页
    return next('/login')
  }
  
  // 检查路由是否需要特定权限
  if (to.meta && to.meta.permission) {
    // 注意：这里应该使用同步的权限检查函数，或者异步检查后再导航
    // 由于我们的checkPermission是异步函数，这里简化处理
    console.warn('路由权限检查：', to.meta.permission);
  }
  
  // 检查路由是否需要特定角色
  if (to.meta && to.meta.role) {
    // 注意：这里应该使用同步的角色检查函数，或者异步检查后再导航
    // 由于我们的checkRole是异步函数，这里简化处理
    console.warn('路由角色检查：', to.meta.role);
  }
  
  // 检查是否是管理员页面
  if (to.meta && to.meta.adminOnly && !isAdmin()) {
    // 不是管理员，重定向到403页面或提示用户
    return next({ name: 'NotFound', params: { pathMatch: '403' } })
  }
  
  // 所有检查通过，继续导航
  next()
})

// 注册权限相关指令
registerAuthDirectives(app)

// 添加全局属性，方便在组件中使用
app.config.globalProperties.$auth = {
  isLoggedIn,
  isAdmin,
  checkPermission,
  checkRole,
  getUserInfo: getCurrentUser
}

// 注册为全局属性 - 选项式API使用
app.config.globalProperties.$request = requestInstance

// 为组合式API提供 - 确保proxy.$request可用
app.provide('$request', requestInstance)

app.use(pinia)
app.use(router)
app.mount('#app')
